/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controladores;

import Controladores.exceptions.IllegalOrphanException;
import Controladores.exceptions.NonexistentEntityException;
import Controladores.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import Entidades.Gradoacademico;
import Entidades.Horariocatedratico;
import java.util.ArrayList;
import java.util.Collection;
import Entidades.Cursoposible;
import Entidades.Asignacionseccioncurso;
import Entidades.Catedratico;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;

/**
 *
 * @author Miguel
 */
public class CatedraticoJpaController implements Serializable {

    public CatedraticoJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Catedratico catedratico) throws PreexistingEntityException, Exception {
        if (catedratico.getHorariocatedraticoCollection() == null) {
            catedratico.setHorariocatedraticoCollection(new ArrayList<Horariocatedratico>());
        }
        if (catedratico.getCursoposibleCollection() == null) {
            catedratico.setCursoposibleCollection(new ArrayList<Cursoposible>());
        }
        if (catedratico.getAsignacionseccioncursoCollection() == null) {
            catedratico.setAsignacionseccioncursoCollection(new ArrayList<Asignacionseccioncurso>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Gradoacademico gradoAcademicoidGradoAcademico = catedratico.getGradoAcademicoidGradoAcademico();
            if (gradoAcademicoidGradoAcademico != null) {
                gradoAcademicoidGradoAcademico = em.getReference(gradoAcademicoidGradoAcademico.getClass(), gradoAcademicoidGradoAcademico.getIdGradoAcademico());
                catedratico.setGradoAcademicoidGradoAcademico(gradoAcademicoidGradoAcademico);
            }
            Collection<Horariocatedratico> attachedHorariocatedraticoCollection = new ArrayList<Horariocatedratico>();
            for (Horariocatedratico horariocatedraticoCollectionHorariocatedraticoToAttach : catedratico.getHorariocatedraticoCollection()) {
                horariocatedraticoCollectionHorariocatedraticoToAttach = em.getReference(horariocatedraticoCollectionHorariocatedraticoToAttach.getClass(), horariocatedraticoCollectionHorariocatedraticoToAttach.getIdHorarioCatedratico());
                attachedHorariocatedraticoCollection.add(horariocatedraticoCollectionHorariocatedraticoToAttach);
            }
            catedratico.setHorariocatedraticoCollection(attachedHorariocatedraticoCollection);
            Collection<Cursoposible> attachedCursoposibleCollection = new ArrayList<Cursoposible>();
            for (Cursoposible cursoposibleCollectionCursoposibleToAttach : catedratico.getCursoposibleCollection()) {
                cursoposibleCollectionCursoposibleToAttach = em.getReference(cursoposibleCollectionCursoposibleToAttach.getClass(), cursoposibleCollectionCursoposibleToAttach.getIdCursoPosible());
                attachedCursoposibleCollection.add(cursoposibleCollectionCursoposibleToAttach);
            }
            catedratico.setCursoposibleCollection(attachedCursoposibleCollection);
            Collection<Asignacionseccioncurso> attachedAsignacionseccioncursoCollection = new ArrayList<Asignacionseccioncurso>();
            for (Asignacionseccioncurso asignacionseccioncursoCollectionAsignacionseccioncursoToAttach : catedratico.getAsignacionseccioncursoCollection()) {
                asignacionseccioncursoCollectionAsignacionseccioncursoToAttach = em.getReference(asignacionseccioncursoCollectionAsignacionseccioncursoToAttach.getClass(), asignacionseccioncursoCollectionAsignacionseccioncursoToAttach.getIdAsignacionSeccionCurso());
                attachedAsignacionseccioncursoCollection.add(asignacionseccioncursoCollectionAsignacionseccioncursoToAttach);
            }
            catedratico.setAsignacionseccioncursoCollection(attachedAsignacionseccioncursoCollection);
            em.persist(catedratico);
            if (gradoAcademicoidGradoAcademico != null) {
                gradoAcademicoidGradoAcademico.getCatedraticoCollection().add(catedratico);
                gradoAcademicoidGradoAcademico = em.merge(gradoAcademicoidGradoAcademico);
            }
            for (Horariocatedratico horariocatedraticoCollectionHorariocatedratico : catedratico.getHorariocatedraticoCollection()) {
                Catedratico oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionHorariocatedratico = horariocatedraticoCollectionHorariocatedratico.getCatedraticoidCatedratico();
                horariocatedraticoCollectionHorariocatedratico.setCatedraticoidCatedratico(catedratico);
                horariocatedraticoCollectionHorariocatedratico = em.merge(horariocatedraticoCollectionHorariocatedratico);
                if (oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionHorariocatedratico != null) {
                    oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionHorariocatedratico.getHorariocatedraticoCollection().remove(horariocatedraticoCollectionHorariocatedratico);
                    oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionHorariocatedratico = em.merge(oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionHorariocatedratico);
                }
            }
            for (Cursoposible cursoposibleCollectionCursoposible : catedratico.getCursoposibleCollection()) {
                Catedratico oldCatedraticoidCatedraticoOfCursoposibleCollectionCursoposible = cursoposibleCollectionCursoposible.getCatedraticoidCatedratico();
                cursoposibleCollectionCursoposible.setCatedraticoidCatedratico(catedratico);
                cursoposibleCollectionCursoposible = em.merge(cursoposibleCollectionCursoposible);
                if (oldCatedraticoidCatedraticoOfCursoposibleCollectionCursoposible != null) {
                    oldCatedraticoidCatedraticoOfCursoposibleCollectionCursoposible.getCursoposibleCollection().remove(cursoposibleCollectionCursoposible);
                    oldCatedraticoidCatedraticoOfCursoposibleCollectionCursoposible = em.merge(oldCatedraticoidCatedraticoOfCursoposibleCollectionCursoposible);
                }
            }
            for (Asignacionseccioncurso asignacionseccioncursoCollectionAsignacionseccioncurso : catedratico.getAsignacionseccioncursoCollection()) {
                Catedratico oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionAsignacionseccioncurso = asignacionseccioncursoCollectionAsignacionseccioncurso.getCatedraticoidCatedratico();
                asignacionseccioncursoCollectionAsignacionseccioncurso.setCatedraticoidCatedratico(catedratico);
                asignacionseccioncursoCollectionAsignacionseccioncurso = em.merge(asignacionseccioncursoCollectionAsignacionseccioncurso);
                if (oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionAsignacionseccioncurso != null) {
                    oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionAsignacionseccioncurso.getAsignacionseccioncursoCollection().remove(asignacionseccioncursoCollectionAsignacionseccioncurso);
                    oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionAsignacionseccioncurso = em.merge(oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionAsignacionseccioncurso);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findCatedratico(catedratico.getNumeroCatedratico()) != null) {
                throw new PreexistingEntityException("Catedratico " + catedratico + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Catedratico catedratico) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Catedratico persistentCatedratico = em.find(Catedratico.class, catedratico.getNumeroCatedratico());
            Gradoacademico gradoAcademicoidGradoAcademicoOld = persistentCatedratico.getGradoAcademicoidGradoAcademico();
            Gradoacademico gradoAcademicoidGradoAcademicoNew = catedratico.getGradoAcademicoidGradoAcademico();
            Collection<Horariocatedratico> horariocatedraticoCollectionOld = persistentCatedratico.getHorariocatedraticoCollection();
            Collection<Horariocatedratico> horariocatedraticoCollectionNew = catedratico.getHorariocatedraticoCollection();
            Collection<Cursoposible> cursoposibleCollectionOld = persistentCatedratico.getCursoposibleCollection();
            Collection<Cursoposible> cursoposibleCollectionNew = catedratico.getCursoposibleCollection();
            Collection<Asignacionseccioncurso> asignacionseccioncursoCollectionOld = persistentCatedratico.getAsignacionseccioncursoCollection();
            Collection<Asignacionseccioncurso> asignacionseccioncursoCollectionNew = catedratico.getAsignacionseccioncursoCollection();
            List<String> illegalOrphanMessages = null;
            for (Horariocatedratico horariocatedraticoCollectionOldHorariocatedratico : horariocatedraticoCollectionOld) {
                if (!horariocatedraticoCollectionNew.contains(horariocatedraticoCollectionOldHorariocatedratico)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Horariocatedratico " + horariocatedraticoCollectionOldHorariocatedratico + " since its catedraticoidCatedratico field is not nullable.");
                }
            }
            for (Cursoposible cursoposibleCollectionOldCursoposible : cursoposibleCollectionOld) {
                if (!cursoposibleCollectionNew.contains(cursoposibleCollectionOldCursoposible)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Cursoposible " + cursoposibleCollectionOldCursoposible + " since its catedraticoidCatedratico field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (gradoAcademicoidGradoAcademicoNew != null) {
                gradoAcademicoidGradoAcademicoNew = em.getReference(gradoAcademicoidGradoAcademicoNew.getClass(), gradoAcademicoidGradoAcademicoNew.getIdGradoAcademico());
                catedratico.setGradoAcademicoidGradoAcademico(gradoAcademicoidGradoAcademicoNew);
            }
            Collection<Horariocatedratico> attachedHorariocatedraticoCollectionNew = new ArrayList<Horariocatedratico>();
            for (Horariocatedratico horariocatedraticoCollectionNewHorariocatedraticoToAttach : horariocatedraticoCollectionNew) {
                horariocatedraticoCollectionNewHorariocatedraticoToAttach = em.getReference(horariocatedraticoCollectionNewHorariocatedraticoToAttach.getClass(), horariocatedraticoCollectionNewHorariocatedraticoToAttach.getIdHorarioCatedratico());
                attachedHorariocatedraticoCollectionNew.add(horariocatedraticoCollectionNewHorariocatedraticoToAttach);
            }
            horariocatedraticoCollectionNew = attachedHorariocatedraticoCollectionNew;
            catedratico.setHorariocatedraticoCollection(horariocatedraticoCollectionNew);
            Collection<Cursoposible> attachedCursoposibleCollectionNew = new ArrayList<Cursoposible>();
            for (Cursoposible cursoposibleCollectionNewCursoposibleToAttach : cursoposibleCollectionNew) {
                cursoposibleCollectionNewCursoposibleToAttach = em.getReference(cursoposibleCollectionNewCursoposibleToAttach.getClass(), cursoposibleCollectionNewCursoposibleToAttach.getIdCursoPosible());
                attachedCursoposibleCollectionNew.add(cursoposibleCollectionNewCursoposibleToAttach);
            }
            cursoposibleCollectionNew = attachedCursoposibleCollectionNew;
            catedratico.setCursoposibleCollection(cursoposibleCollectionNew);
            Collection<Asignacionseccioncurso> attachedAsignacionseccioncursoCollectionNew = new ArrayList<Asignacionseccioncurso>();
            for (Asignacionseccioncurso asignacionseccioncursoCollectionNewAsignacionseccioncursoToAttach : asignacionseccioncursoCollectionNew) {
                asignacionseccioncursoCollectionNewAsignacionseccioncursoToAttach = em.getReference(asignacionseccioncursoCollectionNewAsignacionseccioncursoToAttach.getClass(), asignacionseccioncursoCollectionNewAsignacionseccioncursoToAttach.getIdAsignacionSeccionCurso());
                attachedAsignacionseccioncursoCollectionNew.add(asignacionseccioncursoCollectionNewAsignacionseccioncursoToAttach);
            }
            asignacionseccioncursoCollectionNew = attachedAsignacionseccioncursoCollectionNew;
            catedratico.setAsignacionseccioncursoCollection(asignacionseccioncursoCollectionNew);
            catedratico = em.merge(catedratico);
            if (gradoAcademicoidGradoAcademicoOld != null && !gradoAcademicoidGradoAcademicoOld.equals(gradoAcademicoidGradoAcademicoNew)) {
                gradoAcademicoidGradoAcademicoOld.getCatedraticoCollection().remove(catedratico);
                gradoAcademicoidGradoAcademicoOld = em.merge(gradoAcademicoidGradoAcademicoOld);
            }
            if (gradoAcademicoidGradoAcademicoNew != null && !gradoAcademicoidGradoAcademicoNew.equals(gradoAcademicoidGradoAcademicoOld)) {
                gradoAcademicoidGradoAcademicoNew.getCatedraticoCollection().add(catedratico);
                gradoAcademicoidGradoAcademicoNew = em.merge(gradoAcademicoidGradoAcademicoNew);
            }
            for (Horariocatedratico horariocatedraticoCollectionNewHorariocatedratico : horariocatedraticoCollectionNew) {
                if (!horariocatedraticoCollectionOld.contains(horariocatedraticoCollectionNewHorariocatedratico)) {
                    Catedratico oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico = horariocatedraticoCollectionNewHorariocatedratico.getCatedraticoidCatedratico();
                    horariocatedraticoCollectionNewHorariocatedratico.setCatedraticoidCatedratico(catedratico);
                    horariocatedraticoCollectionNewHorariocatedratico = em.merge(horariocatedraticoCollectionNewHorariocatedratico);
                    if (oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico != null && !oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico.equals(catedratico)) {
                        oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico.getHorariocatedraticoCollection().remove(horariocatedraticoCollectionNewHorariocatedratico);
                        oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico = em.merge(oldCatedraticoidCatedraticoOfHorariocatedraticoCollectionNewHorariocatedratico);
                    }
                }
            }
            for (Cursoposible cursoposibleCollectionNewCursoposible : cursoposibleCollectionNew) {
                if (!cursoposibleCollectionOld.contains(cursoposibleCollectionNewCursoposible)) {
                    Catedratico oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible = cursoposibleCollectionNewCursoposible.getCatedraticoidCatedratico();
                    cursoposibleCollectionNewCursoposible.setCatedraticoidCatedratico(catedratico);
                    cursoposibleCollectionNewCursoposible = em.merge(cursoposibleCollectionNewCursoposible);
                    if (oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible != null && !oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible.equals(catedratico)) {
                        oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible.getCursoposibleCollection().remove(cursoposibleCollectionNewCursoposible);
                        oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible = em.merge(oldCatedraticoidCatedraticoOfCursoposibleCollectionNewCursoposible);
                    }
                }
            }
            for (Asignacionseccioncurso asignacionseccioncursoCollectionOldAsignacionseccioncurso : asignacionseccioncursoCollectionOld) {
                if (!asignacionseccioncursoCollectionNew.contains(asignacionseccioncursoCollectionOldAsignacionseccioncurso)) {
                    asignacionseccioncursoCollectionOldAsignacionseccioncurso.setCatedraticoidCatedratico(null);
                    asignacionseccioncursoCollectionOldAsignacionseccioncurso = em.merge(asignacionseccioncursoCollectionOldAsignacionseccioncurso);
                }
            }
            for (Asignacionseccioncurso asignacionseccioncursoCollectionNewAsignacionseccioncurso : asignacionseccioncursoCollectionNew) {
                if (!asignacionseccioncursoCollectionOld.contains(asignacionseccioncursoCollectionNewAsignacionseccioncurso)) {
                    Catedratico oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso = asignacionseccioncursoCollectionNewAsignacionseccioncurso.getCatedraticoidCatedratico();
                    asignacionseccioncursoCollectionNewAsignacionseccioncurso.setCatedraticoidCatedratico(catedratico);
                    asignacionseccioncursoCollectionNewAsignacionseccioncurso = em.merge(asignacionseccioncursoCollectionNewAsignacionseccioncurso);
                    if (oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso != null && !oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso.equals(catedratico)) {
                        oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso.getAsignacionseccioncursoCollection().remove(asignacionseccioncursoCollectionNewAsignacionseccioncurso);
                        oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso = em.merge(oldCatedraticoidCatedraticoOfAsignacionseccioncursoCollectionNewAsignacionseccioncurso);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = catedratico.getNumeroCatedratico();
                if (findCatedratico(id) == null) {
                    throw new NonexistentEntityException("The catedratico with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Catedratico catedratico;
            try {
                catedratico = em.getReference(Catedratico.class, id);
                catedratico.getNumeroCatedratico();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The catedratico with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Horariocatedratico> horariocatedraticoCollectionOrphanCheck = catedratico.getHorariocatedraticoCollection();
            for (Horariocatedratico horariocatedraticoCollectionOrphanCheckHorariocatedratico : horariocatedraticoCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Catedratico (" + catedratico + ") cannot be destroyed since the Horariocatedratico " + horariocatedraticoCollectionOrphanCheckHorariocatedratico + " in its horariocatedraticoCollection field has a non-nullable catedraticoidCatedratico field.");
            }
            Collection<Cursoposible> cursoposibleCollectionOrphanCheck = catedratico.getCursoposibleCollection();
            for (Cursoposible cursoposibleCollectionOrphanCheckCursoposible : cursoposibleCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Catedratico (" + catedratico + ") cannot be destroyed since the Cursoposible " + cursoposibleCollectionOrphanCheckCursoposible + " in its cursoposibleCollection field has a non-nullable catedraticoidCatedratico field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Gradoacademico gradoAcademicoidGradoAcademico = catedratico.getGradoAcademicoidGradoAcademico();
            if (gradoAcademicoidGradoAcademico != null) {
                gradoAcademicoidGradoAcademico.getCatedraticoCollection().remove(catedratico);
                gradoAcademicoidGradoAcademico = em.merge(gradoAcademicoidGradoAcademico);
            }
            Collection<Asignacionseccioncurso> asignacionseccioncursoCollection = catedratico.getAsignacionseccioncursoCollection();
            for (Asignacionseccioncurso asignacionseccioncursoCollectionAsignacionseccioncurso : asignacionseccioncursoCollection) {
                asignacionseccioncursoCollectionAsignacionseccioncurso.setCatedraticoidCatedratico(null);
                asignacionseccioncursoCollectionAsignacionseccioncurso = em.merge(asignacionseccioncursoCollectionAsignacionseccioncurso);
            }
            em.remove(catedratico);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Catedratico> findCatedraticoEntities() {
        return findCatedraticoEntities(true, -1, -1);
    }

    public List<Catedratico> findCatedraticoEntities(int maxResults, int firstResult) {
        return findCatedraticoEntities(false, maxResults, firstResult);
    }

    private List<Catedratico> findCatedraticoEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Catedratico.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Catedratico findCatedratico(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Catedratico.class, id);
        } finally {
            em.close();
        }
    }

    public int getCatedraticoCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Catedratico> rt = cq.from(Catedratico.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
